home *** CD-ROM | disk | FTP | other *** search
- 100 '-------------------------------------------------------
- 101 '
- 102 ' KAREX2.BAS is a Microsoft BASIC Release 5 program
- 103 ' that solves EXAMPLE 2 of the article
- 104 '
- 105 ' KARMARKAR'S ALGORITHM
- 106 '
- 107 ' by Andrew M. Rockett and John C. Stevenson
- 108 '
- 109 ' This program was written by Andrew M. Rockett
- 110 '
- 111 '-------------------------------------------------------
- 200 '
- 202 ' N is number of unknowns and K is the number
- of equations
- 204 '
- 206 N = 8 : K = 4
- 208 '
- 210 K1 = K + 1 : K2 = 2*K1
- 212 DIM A0(N), XOLD(N), XNEW(N), CC(N), CP(N),
- A(K,N), B(K1,N), B1(K1,K2), B2(N,K1), B3(N,N)
- 214 FOR C = 1 TO N : A0(C) = 1/N : XNEW(C) = A0(C) :
- NEXT C
- 216 '
- 218 ' T is the tolerance
- 220 '
- 222 T = .001
- 224 '
- 226 ' ALPHA is usually set equal to 1/4 ...
- 228 '
- 230 ALPHA = .25
- 232 '
- 234 ITERATION = 0
- 236 '
- 238 ' Data for constraint matrix A
- 240 '
- 242 DATA 1, 0, 1, 0, 0, 0, 1, -3
- 244 DATA 1, 0, 0, -1, 0, 0, 2, -2
- 246 DATA 0, 1, 0, 0, 1, 0, 3, -5
- 248 DATA 0, 1, 0, 0, 0, -1, 4, -4
- 250 '
- 252 FOR R = 1 TO K : FOR C = 1 TO N : READ A(R,C) :
- NEXT C : NEXT R
- 254 '
- 256 ' Data for objective function CC
- 258 '
- 260 DATA 0, 0, 0, 0, 0, 0, 1, 0
- 262 '
- 264 FOR C = 1 TO N : READ CC(C) : NEXT C
- 266 '
- 268 V = 0 : FOR C=1 TO N : V = V + CC(C)*A0(C) :
- NEXT C : VNEW = V
- 270 '
- 272 ' Main iteration process is the same as in
- KAREX1.BAS ...
- 274 '
- 300 WHILE VNEW/V > T
- 301 PRINT USING "###";ITERATION;:
- FOR C=1 TO N:PRINT USING "###.####";XNEW(C); :
- NEXT C :
- PRINT USING "####.#######";VNEW/V
- 302 ITERATION = ITERATION + 1
- 303 FOR C = 1 TO N : XOLD(C) = XNEW(C) : NEXT C
- 304 FOR R=1 TO K:FOR C=1 TO N:B(R,C)=A(R,C)*XOLD(C):
- NEXT C:NEXT R
- 305 FOR C=1 TO N:B(K1,C)=1:NEXT C
- 306 FOR R=1 TO K1 : FOR C=1 TO K2 : B1(R,C)=0 :
- NEXT C : NEXT R
- 307 FOR R=1 TO N : FOR C=1 TO K1 : B2(R,C)=0 :
- NEXT C : NEXT R
- 308 FOR R=1 TO N : FOR C=1 TO N : B3(R,C)=0 :
- NEXT C : NEXT R
- 309 FOR C=1 TO N : CP(C) = 0 : NEXT C
- 310 FOR R=1 TO K1:FOR C=1 TO K1:
- FOR I=1 TO N:B1(R,C)=B1(R,C)+B(R,I)*B(C,I):
- NEXT I:
- NEXT C:NEXT R
- 311 FOR I = 1 TO K1 : B1(I,I+K1)=1 : NEXT I
- 312 FOR R = 1 TO K1
- 313 IF B1(R,R) <> 0 THEN 318
- 314 I = R + 1
- 315 IF I > K1 THEN PRINT "Error! BBT is SINGULAR!" :
- GOTO 407
- 316 IF B1(I,R) = 0 THEN I = I+1 : GOTO 315
- 317 FOR C = 1 TO K2 : SWAP B1(R,C),B1(I,C) : NEXT C
- 318 FOR I = R+1 TO K1:Z = B1(I,R)/B1(R,R):
- FOR C=1 TO K2:B1(I,C)=B1(I,C)-Z*B1(R,C):NEXT C:
- NEXT I
- 319 NEXT R
- 320 FOR R=K1 TO 2 STEP -1:FOR I = R-1 TO 1 STEP -1:Z =
- B1(I,R)/B1(R,R):
- FOR C=R TO K2:B1(I,C)=B1(I,C)-Z*B1(R,C):NEXT C:
- NEXT I:NEXT R
- 321 FOR R=1 TO K1:Z = B1(R,R):
- FOR C=1 TO K2:B1(R,C)=B1(R,C)/Z:NEXT C:
- NEXT R
- 322 FOR R=1 TO N:FOR C=1 TO K1:
- FOR J=1 TO K1:B2(R,C)=B2(R,C)+B(J,R)*B1(J,C+K1):
- NEXT J:
- NEXT C:NEXT R
- 323 FOR R=1 TO N:FOR C=1 TO N:
- FOR J=1 TO K1:B3(R,C)=B3(R,C)+B2(R,J)*B(J,C):
- NEXT J:
- NEXT C:NEXT R
- 324 FOR R = 1 TO N : B3(R,R) = B3(R,R) - 1 : NEXT R
- 325 FOR R=1 TO N:FOR C=1 TO N:B3(R,C)=-1*B3(R,C):
- NEXT C:NEXT R
- 326 FOR R=1 TO N:FOR C=1 TO N:B3(R,C)=B3(R,C)*XOLD(C):
- NEXT C:NEXT R
- 327 FOR R=1 TO N:FOR C=1 TO N:CP(R)=CP(R)+B3(R,C)*CC(C):
- NEXT C:NEXT R
- 328 AA=0:FOR C=1 TO N : AA = AA + CP(C)*CP(C) : NEXT C
- 329 AA = SQR(AA) : FOR C=1 TO N : CP(C) = CP(C)/AA :
- NEXT C
- 330 AA = SQR(N*(N-1))/ALPHA
- 331 FOR C=1 TO N : XNEW(C) = (A0(C) - CP(C)/AA)*XOLD(C) :
- NEXT C
- 332 AA=0:FOR C=1 TO N : AA = AA + XNEW(C) : NEXT C
- 333 FOR C=1 TO N : XNEW(C) = XNEW(C)/AA : NEXT C
- 334 VNEW=0:FOR C=1 TO N:VNEW=VNEW+CC(C)*XNEW(C):NEXT C
- 335 WEND
- 336 '
- 400 PRINT:PRINT"Tolerance reached: Vnew/Vinitial = ";
- VNEW/V:PRINT
- 401 PRINT USING "###"; ITERATION; :
- FOR C=1 TO N:PRINT USING "###.####";XNEW(C); : NEXT C :
- PRINT USING "####.#######";VNEW/V
- 402 '
- 403 ' Project solution from simplex back to orthant ...
- 404 '
- 405 PRINT:FOR C=1 TO N-2:PRINT XNEW(C)/XNEW(N), :
- NEXT C:PRINT
- 406 '
- 407 END